@implementation GdkMacosCairoSubview
+-(void)dealloc
+{
+ g_clear_pointer (&self->clip, cairo_region_destroy);
+ [super dealloc];
+}
+
-(BOOL)isOpaque
{
return _isOpaque;
cr = cairo_create (dest);
cairo_translate (cr, -abs_bounds.origin.x, -abs_bounds.origin.y);
+ /* Apply the clip if provided one */
+ if (self->clip != NULL)
+ {
+ cairo_rectangle_int_t area;
+
+ n_rects = cairo_region_num_rectangles (self->clip);
+ for (guint i = 0; i < n_rects; i++)
+ {
+ cairo_region_get_rectangle (self->clip, i, &area);
+ cairo_rectangle (cr, area.x, area.y, area.width, area.height);
+ }
+
+ cairo_clip (cr);
+ }
+
/* Clip the cairo context based on the rectangles to be drawn
* within the bounding box :rect.
*/
self->_isOpaque = opaque;
}
+-(void)setClip:(cairo_region_t*)region
+{
+ if (region != self->clip)
+ {
+ g_clear_pointer (&self->clip, cairo_region_destroy);
+ if (region != NULL)
+ self->clip = cairo_region_reference (region);
+ }
+}
+
@end
{
BOOL _isOpaque;
cairo_surface_t *cairoSurface;
+ cairo_region_t *clip;
}
-(void)setOpaque:(BOOL)opaque;
-(void)setCairoSurface:(cairo_surface_t *)cairoSurface
withDamage:(cairo_region_t *)region;
+-(void)setClip:(cairo_region_t*)region;
@end
-(void)setOpaqueRegion:(cairo_region_t *)region
{
+ cairo_region_t *transparent_clip;
NSRect abs_bounds;
guint n_rects;
abs_bounds = [self convertRect:[self bounds] toView:nil];
n_rects = cairo_region_num_rectangles (region);
+ /* First, we create a clip region for the transparent region to use so that
+ * we dont end up exposing too much other than the corners on CSD.
+ */
+ transparent_clip = cairo_region_create_rectangle (&(cairo_rectangle_int_t) {
+ abs_bounds.origin.x, abs_bounds.origin.y,
+ abs_bounds.size.width, abs_bounds.size.height
+ });
+ cairo_region_subtract (transparent_clip, region);
+ [(GdkMacosCairoSubview *)self->transparent setClip:transparent_clip];
+ cairo_region_destroy (transparent_clip);
+
/* The common case (at least for opaque windows and CSD) is that we will
* have either one or two opaque rectangles. If we detect that the same
* number of them are available as the previous, we can just resize the